iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0

開頭

MVVM 的流程是網路抓資料存進資料庫,再用觀察的方式查看資料有無變動,如果有就修改畫面,所以資料庫就很重要,這也是為什麼要學要學資料庫操作。

Room 是基於 SQLite 重新封裝過的套件,搭配常數式超好用。

Data class 是 Kotlin 出的新類別,用 Data class 建立的物件會自動建立 get、set、equal,當然也可以自己建立 get 和 set,總之就是很方便。

安裝套件

//基本
kapt 'androidx.room:room-compiler:2.4.0'
implementation "androidx.room:room-runtime:2.4.0"
implementation "androidx.room:room-ktx:2.4.0"

//測試
testImplementation "androidx.room:room-testing:2.4.0"

實體(Entity)建立

在資料庫當中,我們是用物件的形式來儲存資料,所以先建立 Data class 再設定成 Room 的實體

@Entity(tableName = "note_table")
data class Note(
    @PrimaryKey(autoGenerate = true)
    var classId: Long = 0L,
    
    @ColumnInfo(number = "number")
    var number: Int = 0,
    
    @ColumnInfo(name = "name")
    val name: String = "",

上面是放單純的整數或字串,如果要放物件怎麼辦呢?
首先我們先建好一個使用者資訊的 Data class

data class UserInfo(    
    @ColumnInfo(number = "number")
    var number: Int = 0,
    
    @ColumnInfo(name = "name")
    val name: String = "",
)

在物件上使用@Embedded,這樣就行囉

@Entity(tableName = "note_table")
data class Note(
    @PrimaryKey(autoGenerate = true)
    var classId: Long = 0L,
    
    @Embedded(prefix = "userInfo_")
    var userInfo: UserInfo?
)

又如果我們想要放陣列怎麼辦呢?
因為 SQLite 沒有 List 形別,所以要用@TypeConverters轉換還有@Serializable序列化
假如我們有個筆記清單陣列要存入 SQLite

實體長這樣

@Entity(tableName = "note_table")
@TypeConverters(StringTypeConverter::class)
data class Note(
    
    val noteList: List<String>?
)

建立陣列和字串轉換的工具

class StringTypeConverter {
    @TypeConverter
    fun fromString(value: String): List<String> {
        return value.split(",").map { it }
    }

    @TypeConverter
    fun toString(list: List<String>): String {
        return list.joinToString(separator = ",")
    }
}

這樣 Room 在讀取和寫入的時後,就會用StringTypeConverter幫我們自動轉換


上一篇
111/16 - 資料綁定(2/2) - ViewModelFactory、LiveData
下一篇
111/18 - Room(2/4) - Dao
系列文
聽說 HackMD 開放 API 串接,那麼用 Kotlin 寫個筆記 App 吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言